--- tftpd/src/srv.c 2014/02/20 15:39:15 1.2.2.6 +++ tftpd/src/srv.c 2014/02/20 16:04:03 1.2.2.7 @@ -129,6 +129,9 @@ getOpts(rpack_t * __restrict pkt, int rlen) char *opt, *val; int len; + if (!rlen) + return -1; + do { /* option */ len = str_getString(RPACK_NEXT(pkt), RPACK_REMAIN(pkt), NULL); @@ -139,6 +142,7 @@ getOpts(rpack_t * __restrict pkt, int rlen) opt = (char*) rpack_rnext(pkt, len); if (!opt) return -1; + EVERBOSE(7, "opt=%s rlen=%d", opt, rlen); /* value */ len = str_getString(RPACK_NEXT(pkt), RPACK_REMAIN(pkt), NULL); if (len == -1) @@ -148,22 +152,16 @@ getOpts(rpack_t * __restrict pkt, int rlen) val = (char*) rpack_rnext(pkt, len); if (!val) return -1; + EVERBOSE(7, "val=%s rlen=%d", val, rlen); if (!strcasecmp(opt, TFTP_OPT_BLKSIZE)) { - len = strtol(val, NULL, 10); - if (len > TFTP_LOAD_MAX) { - cli.siz = len; - if (rpack_resize(pkt, cli.siz + 4)) - cli.siz = TFTP_PKT_MAX; - } + cli.tmp = strtol(val, NULL, 10); } else if (!strcasecmp(opt, TFTP_OPT_TSIZE)) cli.tsiz = strtoll(val, NULL, 10); else if (!strcasecmp(opt, TFTP_OPT_TIMEOUT)) cli.tout = strtol(val, NULL, 10); else if (!strcasecmp(opt, TFTP_OPT_ROLLOVER)) cli.roll = strtol(val, NULL, 10); - else - return -1; } while (rlen > 0); EVERBOSE(4, "blksize=%u tsize=%llu timeout=%u rollover=%u", @@ -292,10 +290,16 @@ RQ(sched_task_t *task) schedEvent(TASK_ROOT(task), execProg, "request", 0, NULL, cli.opc); - if (!RPACK_ISEND(pkt) && !getOpts(pkt, rlen)) + if (!getOpts(pkt, rlen)) { + if (cli.tmp > TFTP_LOAD_MAX) { + if (rpack_resize(pkt, cli.tmp + 4)) + ELIBERR(elwix); + else + cli.siz = cli.tmp; + } schedEvent(TASK_ROOT(task), txOack, NULL, TASK_FD(task), TASK_DATA(task), 0); - else if (cli.opc == TFTP_OPC_WRQ) { + } else if (cli.opc == TFTP_OPC_WRQ) { /* ack */ tftp->tftp_opc = htons(TFTP_OPC_ACK); RPACK_REWIND(pkt);