Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP
id AA7585 ; Mon, 25 Jan 93 12:18:23 EST
Newsgroups: comp.unix.bsd
Path: sserve!manuel.anu.edu.au!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)