X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fh2ext.c;h=af1cc5ab763f8368d6582cf22fc05205c0d1af9d;hb=75ac71075cfd9a33c00e03b89a724547ae0b1edd;hp=d1050c8b9ba0dd1cc4f0e85fd43883f0be5b944e;hpb=6748c9f084926d640133c27eea34c34bb07c1191;p=util-vserver.git diff --git a/src/h2ext.c b/src/h2ext.c index d1050c8..af1cc5a 100644 --- a/src/h2ext.c +++ b/src/h2ext.c @@ -45,6 +45,8 @@ #define MAX_PEEK_SIZE 4096 #define MIN(a,b) (((a) > (b)) ? (b) : (a)) +#define STRINGIFY_(x) #x +#define STRINGIFY(x) STRINGIFY_(x) struct file_format { /* where the value would be in the file */ @@ -208,17 +210,6 @@ byteswap(void *p, size_t len) } } -static inline ALWAYSINLINE void -WRITE_INT(int fd, int num) -{ - char buf[sizeof(num)*3+2]; - size_t l; - - l = utilvserver_fmt_long(buf,num); - - Vwrite(fd, buf, l); -} - static int load_description(const char *file, file_format_t **head) { @@ -273,9 +264,10 @@ load_description(const char *file, file_format_t **head) } i->next = NULL; -#define get_field() for (ptr++; *ptr == '\t' && *ptr != '\0'; ptr++); \ - for (field = ptr; *ptr != '\t' && *ptr != '\0'; ptr++); \ - *ptr = '\0'; +#define get_field() if (*(ptr+1) == '\0') goto new_line_and_free; \ + for (ptr++; *ptr == '\t' && *ptr != '\0'; ptr++); \ + for (field = ptr; *ptr != '\t' && *ptr != '\0'; ptr++); \ + *ptr = '\0'; field = ptr = buf; while (*ptr != '\t' && *ptr != '\0') ptr++; @@ -361,6 +353,25 @@ load_description(const char *file, file_format_t **head) get_field(); i->peek_inside = (int)strtol(field, NULL, 0); + /* sanity check the entry */ + if (i->offset < 0) { + WRITE_MSG(2, ENSC_WRAPPERS_PREFIX); + WRITE_STR(2, file); + WRITE_MSG(2, ":"); + WRITE_INT(2, line_no); + WRITE_MSG(2, " has an invalid offset: "); + WRITE_INT(2, i->offset); + WRITE_MSG(2, "\n"); + goto new_line_and_free; + } + else if ((i->offset + i->len) > MAX_PEEK_SIZE) { + WRITE_MSG(2, ENSC_WRAPPERS_PREFIX); + WRITE_STR(2, file); + WRITE_MSG(2, ":"); + WRITE_INT(2, line_no); + WRITE_MSG(2, " exceeds maximum offset (" STRINGIFY(MAX_PEEK_SIZE) ")\n"); + goto new_line_and_free; + } #undef get_field goto new_line;