Module Name: src Committed By: christos Date: Thu Jul 4 02:58:20 UTC 2013
Modified Files: src/libexec/tftpd: tftpd.c Log Message: Simplify error handling and make it actually return a useable error code. (Maxime Villard) To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/libexec/tftpd/tftpd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/tftpd/tftpd.c diff -u src/libexec/tftpd/tftpd.c:1.41 src/libexec/tftpd/tftpd.c:1.42 --- src/libexec/tftpd/tftpd.c:1.41 Wed Jul 3 17:20:45 2013 +++ src/libexec/tftpd/tftpd.c Wed Jul 3 22:58:20 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: tftpd.c,v 1.41 2013/07/03 21:20:45 christos Exp $ */ +/* $NetBSD: tftpd.c,v 1.42 2013/07/04 02:58:20 christos Exp $ */ /* * Copyright (c) 1983, 1993 @@ -36,7 +36,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19 #if 0 static char sccsid[] = "@(#)tftpd.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: tftpd.c,v 1.41 2013/07/03 21:20:45 christos Exp $"); +__RCSID("$NetBSD: tftpd.c,v 1.42 2013/07/04 02:58:20 christos Exp $"); #endif #endif /* not lint */ @@ -420,7 +420,7 @@ main(int argc, char *argv[]) static int blk_handler(struct tftphdr *tp, const char *val, char *ack, size_t asize, - size_t *ackl, int *ec) + size_t *ackl, int *ecode) { unsigned long bsize; char *endp; @@ -438,7 +438,8 @@ blk_handler(struct tftphdr *tp, const ch verifyhost((struct sockaddr *)&from), tp->th_opcode == WRQ ? "write" : "read", tp->th_stuff, val); - return 0; + *ecode = EBADOP; + return -1; } if (bsize < 8 || bsize > 65464) { syslog(LOG_NOTICE, "%s: %s request for %s: " @@ -446,22 +447,25 @@ blk_handler(struct tftphdr *tp, const ch verifyhost((struct sockaddr *)&from), tp->th_opcode == WRQ ? "write" : "read", tp->th_stuff, val); - return 0; + *ecode = EBADOP; + return -1; } tftp_blksize = bsize; if (asize > *ackl && (l = snprintf(ack + *ackl, asize - *ackl, - "blksize%c%lu%c", 0, bsize, 0)) > 0) + "blksize%c%lu%c", 0, bsize, 0)) > 0) { *ackl += l; - else + } else { + *ecode = EBADOP; return -1; + } return 0; } static int timeout_handler(struct tftphdr *tp, const char *val, char *ack, size_t asize, - size_t *ackl, int *ec) + size_t *ackl, int *ecode) { unsigned long tout; char *endp; @@ -475,7 +479,8 @@ timeout_handler(struct tftphdr *tp, cons verifyhost((struct sockaddr *)&from), tp->th_opcode == WRQ ? "write" : "read", tp->th_stuff, val); - return 0; + *ecode = EBADOP; + return -1; } if (tout < 1 || tout > 255) { syslog(LOG_NOTICE, "%s: %s request for %s: " @@ -509,7 +514,7 @@ timeout_handler(struct tftphdr *tp, cons static int tsize_handler(struct tftphdr *tp, const char *val, char *ack, size_t asize, - size_t *ackl, int *ec) + size_t *ackl, int *ecode) { unsigned long fsize; char *endp; @@ -528,7 +533,8 @@ tsize_handler(struct tftphdr *tp, const verifyhost((struct sockaddr *)&from), tp->th_opcode == WRQ ? "write" : "read", tp->th_stuff, val); - return 0; + *ecode = EBADOP; + return -1; } if (fsize > (unsigned long) 65535 * 65464) { syslog(LOG_NOTICE, "%s: %s request for %s: " @@ -536,7 +542,8 @@ tsize_handler(struct tftphdr *tp, const verifyhost((struct sockaddr *)&from), tp->th_opcode == WRQ ? "write" : "read", tp->th_stuff, val); - return 0; + *ecode = EBADOP; + return -1; } tftp_opt_tsize = 1; @@ -566,11 +573,11 @@ static const struct tftp_options { */ static int get_options(struct tftphdr *tp, char *cp, int size, char *ackb, size_t asize, - size_t *alen, int *err) + size_t *alen, int *ecode) { const struct tftp_options *op; char *option, *value, *endp; - int r, rv=0, ec=0; + int r, rv=0; endp = cp + size; while (cp < endp) { @@ -598,7 +605,7 @@ get_options(struct tftphdr *tp, char *cp break; } if (op->o_name) { - r = op->o_handler(tp, value, ackb, asize, alen, &ec); + r = op->o_handler(tp, value, ackb, asize, alen, ecode); if (r < 0) { rv = -1; break; @@ -606,9 +613,6 @@ get_options(struct tftphdr *tp, char *cp rv++; } /* else ignore unknown options */ } - - if (rv < 0) - *err = ec; return rv; }