home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: comp.unix.bsd
- Path: sparky!uunet!munnari.oz.au!metro!ipso!runxtsa!bde
- From: bde@runx.oz.au (Bruce Evans)
- Subject: [386BSD] Bug + fix: NAME_MAX off by 1
- Message-ID: <1993Jan22.182148.5188@runx.oz.au>
- Organization: RUNX Un*x Timeshare. Sydney, Australia.
- Date: Fri, 22 Jan 93 18:21:48 GMT
- Lines: 77
-
- File names of length NAME_MAX do not work in 386BSD-0.1. Names of length
- NAME_MAX - 1 are OK. Reducing NAME_MAX by 1 to 254 would not help - it
- would invalidate the documentation and reduce the actual maximum by 1.
-
- This program demonstrates the bug:
-
- ---
- NAME_MAX-test.c
- ---
- #include <errno.h>
- #include <fcntl.h>
- #include <limits.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
-
- int errors;
-
- void test(size_t component_length, int expect_error);
-
- int main(void)
- {
- test(NAME_MAX, 1);
- test(NAME_MAX + 1, 0);
- exit(errors ? 1 : 0);
- }
-
- void test(size_t component_length, int expect_error)
- {
- int fd;
- char *name;
-
- name = malloc(5 + component_length);
- if (name == NULL)
- {
- perror("malloc");
- abort();
- }
- sprintf(name, "/tmp/%0*d", (int) component_length, 0);
- fd = creat(name, 0666);
- if (fd >= 0) {
- (void) unlink(name);
- fprintf(stderr, "%s: length %d didn't cause an error\n",
- expect_error ? " OK" : "oops", (int) component_length);
- if (expect_error)
- ++errors;
- }
- else {
- fprintf(stderr, "%s: length %d caused error `%s'\n",
- !expect_error ? " OK" : "oops", (int) component_length,
- strerror(errno));
- if (!expect_error)
- ++errors;
- }
- }
- ---
-
- This might be a fix:
-
- *** vfs_lookup.c~ Wed Dec 25 09:24:09 1991
- --- vfs_lookup.c Tue Jan 19 21:25:50 1993
- ***************
- *** 275,279 ****
- ndp->ni_hash += (unsigned char)*cp;
- ndp->ni_namelen = cp - ndp->ni_ptr;
- ! if (ndp->ni_namelen >= NAME_MAX) {
- error = ENAMETOOLONG;
- goto bad;
- --- 275,279 ----
- ndp->ni_hash += (unsigned char)*cp;
- ndp->ni_namelen = cp - ndp->ni_ptr;
- ! if (ndp->ni_namelen > NAME_MAX) {
- error = ENAMETOOLONG;
- goto bad;
- --
- Bruce Evans (bde@runx.oz.au)
-