1
Patch from Michal 'hramrach' Suchanek" <hramrach_l@centrum.cz>
3
Index: Linux-PAM/modules/pam_mkhomedir/pam_mkhomedir.c
4
===================================================================
5
RCS file: /afs/sipb/project/debian/cvs/pam/Linux-PAM/modules/pam_mkhomedir/pam_mkhomedir.c,v
6
retrieving revision 1.3
7
diff -u -r1.3 pam_mkhomedir.c
8
--- Linux-PAM/modules/pam_mkhomedir/pam_mkhomedir.c 15 Sep 2002 20:18:00 -0000 1.3
9
+++ Linux-PAM/modules/pam_mkhomedir/pam_mkhomedir.c 25 Nov 2002 02:40:01 -0000
15
+ char *newsource=NULL, *newdest=NULL;
16
+ /* track length of buffers */
17
+ int nslen=0, ndlen=0,
18
+ slen=strlen(source), dlen=strlen(dest);
19
+ /* XXX should I check for strlen, sprintf, malloc ? */
21
char newsource[PATH_MAX], newdest[PATH_MAX];
24
/* Skip some files.. */
25
if (strcmp(Dir->d_name,".") == 0 ||
26
@@ -225,37 +233,103 @@
29
/* Determine what kind of file it is. */
31
+ nslen=slen+strlen(Dir->d_name)+2;
32
+ if((newsource=malloc(nslen))==NULL){
35
+ sprintf(newsource,"%s/%s",source,Dir->d_name);
37
snprintf(newsource,sizeof(newsource),"%s/%s",source,Dir->d_name);
39
if (lstat(newsource,&St) != 0)
42
+ free(newsource);newsource=NULL;
50
/* We'll need the new file's name. */
52
+ ndlen=dlen+strlen(Dir->d_name)+2;
53
+ if((newdest=malloc(ndlen))==NULL){
57
+ sprintf(newdest,"%s/%s",dest,Dir->d_name);
59
snprintf(newdest,sizeof(newdest),"%s/%s",dest,Dir->d_name);
62
/* If it's a directory, recurse. */
63
if (S_ISDIR(St.st_mode))
65
create_homedir(pamh, ctrl, pwd, newsource, newdest);
67
+ free(newsource);newsource=NULL;
68
+ free(newdest);newdest=NULL;
73
/* If it's a symlink, create a new link. */
74
if (S_ISLNK(St.st_mode))
84
+ pointed = (char *) malloc (size);
86
+ free(newsource); free(newdest);
89
+ pointedlen = readlink (newsource, pointed, size);
90
+ if (pointedlen < 0) break;
91
+ if (pointedlen < size) break;
99
+ pointed[pointedlen]=0;
101
char pointed[PATH_MAX];
102
memset(pointed, 0, sizeof(pointed));
103
- if(readlink(newsource, pointed, sizeof(pointed) - 1) != -1)
105
+ pointedlen=readlink(newsource, pointed, sizeof(pointed) - 1);
107
+ if(pointedlen>=0) {
108
if(symlink(pointed, newdest) == 0)
110
if (lchown(newdest,pwd->pw_uid,pwd->pw_gid) != 0)
112
- _log_err(LOG_DEBUG, "unable to chang perms on link %s",
113
+ _log_err(LOG_DEBUG, "unable to change perms on link %s",
117
+ free(newsource); free(newdest);
119
return PAM_PERM_DENIED;
127
+ free(newsource);newsource=NULL;
128
+ free(newdest);newdest=NULL;
134
* the new device node, FIFO, or whatever it is. */
135
if (!S_ISREG(St.st_mode))
138
+ free(newsource);newsource=NULL;
139
+ free(newdest);newdest=NULL;
145
if ((SrcFd = open(newsource,O_RDONLY)) < 0 || fstat(SrcFd,&St) != 0)
147
_log_err(LOG_DEBUG, "unable to open src file %s",newsource);
149
+ free(newsource); free(newdest);
151
return PAM_PERM_DENIED;
157
_log_err(LOG_DEBUG, "unable to open dest file %s",newdest);
159
+ free(newsource); free(newdest);
161
return PAM_PERM_DENIED;
167
_log_err(LOG_DEBUG, "unable to chang perms on copy %s",newdest);
169
+ free(newsource); free(newdest);
171
return PAM_PERM_DENIED;
174
@@ -303,12 +390,19 @@
177
_log_err(LOG_DEBUG, "unable to perform IO");
179
+ free(newsource); free(newdest);
181
return PAM_PERM_DENIED;
188
+ free(newsource);newsource=NULL;
189
+ free(newdest);newdest=NULL;