diff options
author | Thorsten Kukuk <kukuk@thkukuk.de> | 2004-09-22 09:37:46 +0000 |
---|---|---|
committer | Thorsten Kukuk <kukuk@thkukuk.de> | 2004-09-22 09:37:46 +0000 |
commit | 6e99aa00d23a68650fdd4fae01aab812dcfe10eb (patch) | |
tree | 0b929b30fa38ed1d402515fbf9d7d8cf6dcb5284 /modules/pammodutil | |
parent | e1f75a80821125170e23a9b920d138a4a952c708 (diff) | |
download | pam-6e99aa00d23a68650fdd4fae01aab812dcfe10eb.tar.gz pam-6e99aa00d23a68650fdd4fae01aab812dcfe10eb.tar.bz2 pam-6e99aa00d23a68650fdd4fae01aab812dcfe10eb.zip |
Relevant BUGIDs:
Purpose of commit:
Commit summary:
---------------
bugfix: Add rest of Steve Grubb's resource leak and other fixes
Diffstat (limited to 'modules/pammodutil')
-rw-r--r-- | modules/pammodutil/Makefile | 2 | ||||
-rw-r--r-- | modules/pammodutil/include/security/_pam_modutil.h | 4 | ||||
-rw-r--r-- | modules/pammodutil/modutil_ioloop.c | 50 |
3 files changed, 55 insertions, 1 deletions
diff --git a/modules/pammodutil/Makefile b/modules/pammodutil/Makefile index b4868528..c1f1b9a7 100644 --- a/modules/pammodutil/Makefile +++ b/modules/pammodutil/Makefile @@ -19,7 +19,7 @@ CFLAGS += $(PIC) $(STATIC) $(MOREFLAGS) \ # all the object files we care about LIBOBJECTS = modutil_cleanup.o modutil_getpwnam.o modutil_getpwuid.o \ - modutil_getlogin.o + modutil_getlogin.o modutil_ioloop.o # static library name LIBSTATIC = $(LIBNAME).a diff --git a/modules/pammodutil/include/security/_pam_modutil.h b/modules/pammodutil/include/security/_pam_modutil.h index 5e063651..5b95e279 100644 --- a/modules/pammodutil/include/security/_pam_modutil.h +++ b/modules/pammodutil/include/security/_pam_modutil.h @@ -32,4 +32,8 @@ extern void _pammodutil_cleanup(pam_handle_t *pamh, void *data, extern const char *_pammodutil_getlogin(pam_handle_t *pamh); +extern int _pammodutil_read(int fd, char *buffer, int count); + +extern int _pammodutil_write(int fd, const char *buffer, int count); + #endif /* _PAM_MODUTIL_H */ diff --git a/modules/pammodutil/modutil_ioloop.c b/modules/pammodutil/modutil_ioloop.c new file mode 100644 index 00000000..4176b658 --- /dev/null +++ b/modules/pammodutil/modutil_ioloop.c @@ -0,0 +1,50 @@ +/* + * $Id$ + * + * These functions provides common methods for ensure a complete read or + * write occurs. It handles EINTR and partial read/write returns. + */ + +#include <unistd.h> +#include <errno.h> + +int _pammodutil_read(int fd, char *buffer, int count) +{ + int block, offset = 0; + + while (count > 0) { + block = read(fd, &buffer[offset], count); + + if (block < 0) { + if (errno == EINTR) continue; + return block; + } + if (block == 0) return offset; + + offset += block; + count -= block; + } + + return offset; +} + +int _pammodutil_write(int fd, const char *buffer, int count) +{ + int block, offset = 0; + + while (count > 0) { + block = write(fd, &buffer[offset], count); + + if (block < 0) { + if (errno == EINTR) continue; + return block; + } + if (block == 0) return offset; + + offset += block; + count -= block; + } + + return offset; +} + |