|
Message-ID: <CACepeQ8NfqPG1Ea2t7FNocF+-pdYOJzHNTwJMw8z6mPhkP5mkQ@mail.gmail.com> Date: Wed, 14 Feb 2018 16:50:44 -0200 From: Geraldo Netto <geraldonetto@...il.com> To: musl@...ts.openwall.com Subject: fread() - possible division by zero Dear Friends, It seems we may have the same division by zero issue on fread(): This is the original code: size_t fread(void *restrict destv, size_t size, size_t nmemb, FILE *restrict f) { unsigned char *dest = destv; size_t len = size*nmemb, l = len, k; if (!size) nmemb = 0; FLOCK(f); f->mode |= f->mode-1; if (f->rend - f->rpos > 0) { /* First exhaust the buffer. */ k = MIN(f->rend - f->rpos, l); memcpy(dest, f->rpos, k); f->rpos += k; dest += k; l -= k; } /* Read the remainder directly */ for (; l; l-=k, dest+=k) { k = __toread(f) ? 0 : f->read(f, dest, l); if (k+1<=1) { FUNLOCK(f); return (len-l)/size; } } FUNLOCK(f); return nmemb; } It seems we need to check the variable size on return because if size is zero We'll have a division by zero and a segmentation fault I'm sending the attached patch that changes the return as follows: return (len-l)/(size != 0 ? size : 1); I don't know if this is the correct approach, so, feel free to change/let me know how to fix :) Hope it helps Kind Regards, Geraldo Netto Sapere Aude => Non dvcor, dvco http://exdev.sf.net/ Content of type "text/html" skipped Download attachment "0001-fread-avoid-possible-division-by-zero-when-size-0.patch" of type "application/octet-stream" (755 bytes)
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.