Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- __init int
- routerboot_find_tag(u8 *buf, unsigned int buflen, u16 tag_id,
- u8 **tag_data, u16 *tag_len)
- {
- uint32_t magic;
- bool align = false;
- int ret;
- if (buflen < 4)
- return -EINVAL;
- magic = get_u32(buf);
- switch (magic) {
- case RB_MAGIC_ERD:
- align = true;
- /* fall trough */
- case RB_MAGIC_HARD:
- /* skip magic value */
- buf += 4;
- buflen -= 4;
- break;
- case RB_MAGIC_SOFT:
- if (buflen < 8)
- return -EINVAL;
- /* skip magic and CRC value */
- buf += 8;
- buflen -= 8;
- break;
- default:
- return -EINVAL;
- }
- ret = -ENOENT;
- while (buflen > 2) {
- u16 id;
- u16 len;
- len = get_u16(buf);
- buf += 2;
- buflen -= 2;
- if (buflen < 2)
- break;
- id = get_u16(buf);
- pr_err("debug: id = %X\n", id);
- buf += 2;
- buflen -= 2;
- if (id == RB_ID_TERMINATOR)
- break;
- if (buflen < len)
- break;
- if (id == tag_id) {
- if (tag_len)
- *tag_len = len;
- if (tag_data)
- *tag_data = buf;
- ret = 0;
- break;
- }
- if (align)
- len = (len + 3) / 4;
- buf += len;
- buflen -= len;
- }
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement