From c33495ca9cf1bb12ac5bc3263458fdf3331c1f89 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Sun, 9 Sep 2001 17:32:03 +0000 Subject: 2001-08-31 Marcus Brinkmann * file-get-translator.c (netfs_S_file_get_translator): If asprintf() fails, set ERR to errno. * dir-lookup.c (netfs_S_dir_lookup): Catch if asprintf() fails and return ENOMEM. If netfs_make_protid() fails, set ERROR to errno, not ENOMEM. Do this before freeing USER. * dir-mkfile.c (netfs_S_dir_mkfile): If netfs_make_protid() fails, set ERROR to errno and free USER. * file-exec.c (netfs_S_file_exec): Likewise. Reported by Igor Khavkine . --- libnetfs/ChangeLog | 12 ++++++++++++ libnetfs/dir-lookup.c | 23 ++++++++++++++++------- libnetfs/dir-mkfile.c | 14 +++++++++++--- libnetfs/file-exec.c | 29 +++++++++++++++++++---------- libnetfs/file-get-translator.c | 21 +++++++++++++-------- 5 files changed, 71 insertions(+), 28 deletions(-) (limited to 'libnetfs') diff --git a/libnetfs/ChangeLog b/libnetfs/ChangeLog index 752eacee..c2b7c7a3 100644 --- a/libnetfs/ChangeLog +++ b/libnetfs/ChangeLog @@ -1,3 +1,15 @@ +2001-08-31 Marcus Brinkmann + + * file-get-translator.c (netfs_S_file_get_translator): If + asprintf() fails, set ERR to errno. + * dir-lookup.c (netfs_S_dir_lookup): Catch if asprintf() fails and + return ENOMEM. If netfs_make_protid() fails, set ERROR to errno, + not ENOMEM. Do this before freeing USER. + * dir-mkfile.c (netfs_S_dir_mkfile): If netfs_make_protid() fails, + set ERROR to errno and free USER. + * file-exec.c (netfs_S_file_exec): Likewise. + Reported by Igor Khavkine . + 2001-06-21 Neal H Walfield * file-getcontrol.c (netfs_S_file_getcontrol): When checking if diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c index 6911f5ae..bf81a17b 100644 --- a/libnetfs/dir-lookup.c +++ b/libnetfs/dir-lookup.c @@ -209,17 +209,19 @@ netfs_S_dir_lookup (struct protid *diruser, { case S_IFCHR: case S_IFBLK: - asprintf (argz, "%s%c%d%c%d", - (S_ISCHR (np->nn_stat.st_mode) - ? _HURD_CHRDEV : _HURD_BLKDEV), - 0, major (np->nn_stat.st_rdev), - 0, minor (np->nn_stat.st_rdev)); + if (asprintf (argz, "%s%c%d%c%d", + (S_ISCHR (np->nn_stat.st_mode) + ? _HURD_CHRDEV : _HURD_BLKDEV), + 0, major (np->nn_stat.st_rdev), + 0, minor (np->nn_stat.st_rdev)) < 0) + return ENOMEM; *argz_len = strlen (*argz) + 1; *argz_len += strlen (*argz + *argz_len) + 1; *argz_len += strlen (*argz + *argz_len) + 1; break; case S_IFIFO: - asprintf (argz, "%s", _HURD_FIFO); + if (asprintf (argz, "%s", _HURD_FIFO) < 0) + return ENOMEM; *argz_len = strlen (*argz) + 1; break; default: @@ -242,8 +244,8 @@ netfs_S_dir_lookup (struct protid *diruser, user); if (! newpi) { + error = errno; iohelp_free_iouser (user); - error = ENOMEM; } } @@ -381,6 +383,13 @@ netfs_S_dir_lookup (struct protid *diruser, newpi = netfs_make_protid (netfs_make_peropen (np, flags, diruser->po), user); + if (! newpi) + { + iohelp_free_iouser (user); + error = errno; + goto out; + } + *retry_port = ports_get_right (newpi); ports_port_deref (newpi); diff --git a/libnetfs/dir-mkfile.c b/libnetfs/dir-mkfile.c index 16c5dd77..7d388737 100644 --- a/libnetfs/dir-mkfile.c +++ b/libnetfs/dir-mkfile.c @@ -44,9 +44,17 @@ netfs_S_dir_mkfile (struct protid *diruser, int flags, mode_t mode, newpi = netfs_make_protid (netfs_make_peropen (np, flags, diruser->po), user); - *newfile = ports_get_right (newpi); - *newfiletype = MACH_MSG_TYPE_MAKE_SEND; - ports_port_deref (newpi); + if (newpi) + { + *newfile = ports_get_right (newpi); + *newfiletype = MACH_MSG_TYPE_MAKE_SEND; + ports_port_deref (newpi); + } + else + { + err = errno; + iohelp_free_iouser (user); + } } netfs_nput (np); } diff --git a/libnetfs/file-exec.c b/libnetfs/file-exec.c index 4f9e5034..9839c694 100644 --- a/libnetfs/file-exec.c +++ b/libnetfs/file-exec.c @@ -130,16 +130,25 @@ netfs_S_file_exec (struct protid *cred, { newpi = netfs_make_protid (netfs_make_peropen (np, O_READ, cred->po), user); - right = ports_get_send_right (newpi); - err = exec_exec (_netfs_exec, - right, MACH_MSG_TYPE_COPY_SEND, - task, flags, argv, argvlen, envp, envplen, - fds, MACH_MSG_TYPE_COPY_SEND, fdslen, - portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, - intarray, intarraylen, deallocnames, deallocnameslen, - destroynames, destroynameslen); - mach_port_deallocate (mach_task_self (), right); - ports_port_deref (newpi); + if (newpi) + { + right = ports_get_send_right (newpi); + err = exec_exec (_netfs_exec, + right, MACH_MSG_TYPE_COPY_SEND, + task, flags, argv, argvlen, envp, envplen, + fds, MACH_MSG_TYPE_COPY_SEND, fdslen, + portarray, MACH_MSG_TYPE_COPY_SEND, portarraylen, + intarray, intarraylen, + deallocnames, deallocnameslen, + destroynames, destroynameslen); + mach_port_deallocate (mach_task_self (), right); + ports_port_deref (newpi); + } + else + { + err = errno; + iohelp_free_iouser (user); + } } } diff --git a/libnetfs/file-get-translator.c b/libnetfs/file-get-translator.c index 44caa91c..3108acd7 100644 --- a/libnetfs/file-get-translator.c +++ b/libnetfs/file-get-translator.c @@ -73,14 +73,19 @@ netfs_S_file_get_translator (struct protid *user, : _HURD_BLKDEV), '\0', (np->nn_stat.st_rdev >> 8) & 0377, '\0', (np->nn_stat.st_rdev) & 0377); - buflen++; /* terminating nul */ - - if (buflen > *translen) - *trans = mmap (0, buflen, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0); - memcpy (*trans, buf, buflen); - free (buf); - *translen = buflen; - err = 0; + if (buflen < 0) + err = ENOMEM; + else + { + buflen++; /* terminating nul */ + + if (buflen > *translen) + *trans = mmap (0, buflen, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0); + memcpy (*trans, buf, buflen); + free (buf); + *translen = buflen; + err = 0; + } } else if (S_ISFIFO (np->nn_stat.st_mode)) { -- cgit v1.2.3