? tftpd ? tftpd.8.manlint Index: tftpd.c =================================================================== RCS file: /cvs/src/usr.sbin/tftpd/tftpd.c,v retrieving revision 1.27 diff -u -p -r1.27 tftpd.c --- tftpd.c 18 Jul 2015 05:32:56 -0000 1.27 +++ tftpd.c 19 Jul 2015 05:37:02 -0000 @@ -148,7 +148,6 @@ struct tftp_client { int newline; int sock; - int seed; }; __dead void usage(void); @@ -941,9 +935,16 @@ validate_access(struct tftp_client *clie const char *errstr; if (strcmp(filename, SEEDPATH) == 0) { - if (mode != RRQ) + char *buf; + if (mode != RRQ) return (EACCESS); - client->seed = 1; + + buf = client->buf + sizeof(client->buf) - 512; + arc4random_buf(buf, 512); + client->file = fmemopen(buf, 512, "r"); + if (client->file == NULL) + return (errno + 100); + return (0); } @@ -1086,26 +1087,17 @@ file_read(struct tftp_client *client) dp->th_block = htons(client->block); buf = (u_int8_t *)dp->th_data; - if (client->seed) { - if (client->block * client->segment_size > SEGSIZE) { - i = SEGSIZE % client->segment_size; - } else { - i = client->segment_size; - } - arc4random_buf(buf, i); - } else { - for (i = 0; i < client->segment_size; i++) { - c = client->fgetc(client); - if (c == EOF) { - if (ferror(client->file)) { - nak(client, 100 + EIO); - return; - } - - break; + for (i = 0; i < client->segment_size; i++) { + c = client->fgetc(client); + if (c == EOF) { + if (ferror(client->file)) { + nak(client, 100 + EIO); + return; } - buf[i] = c; + + break; } + buf[i] = c; } client->buflen = i + 4; @@ -1319,8 +1311,7 @@ tftp_wrq(int fd, short events, void *arg if (n < client->packet_size) { tftp_wrq_ack_packet(client); - if (client->file != NULL) - fclose(client->file); + fclose(client->file); client->file = NULL; event_set(&client->sev, client->sock, EV_READ, tftp_wrq_end, client);