diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/client/clitar.c | 366 |
1 files changed, 225 insertions, 141 deletions
diff --git a/source3/client/clitar.c b/source3/client/clitar.c index 1b0ea59a9a..ce2902e5e9 100644 --- a/source3/client/clitar.c +++ b/source3/client/clitar.c @@ -1,19 +1,19 @@ -/* +/* Unix SMB/CIFS implementation. Tar Extensions Copyright (C) Ricky Poulten 1995-1998 Copyright (C) Richard Sharpe 1998 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -21,7 +21,7 @@ Systems Research Australia (CISRA) 1. Restore can now restore files with long file names - 2. Save now saves directory information so that we can restore + 2. Save now saves directory information so that we can restore directory creation times 3. tar now accepts both UNIX path names and DOS path names. I prefer those lovely /'s to those UGLY \'s :-) @@ -38,8 +38,6 @@ #include "clitar.h" #include "client/client_proto.h" -static pstring cur_dir; /* FIXME !!! JRA*/ - static int clipfind(char **aret, int ret, char *tok); typedef struct file_info_struct file_info2; @@ -53,8 +51,7 @@ struct file_info_struct { struct timespec mtime_ts; struct timespec atime_ts; struct timespec ctime_ts; - char *name; /* This is dynamically allocate */ - + char *name; /* This is dynamically allocated */ file_info2 *next, *prev; /* Used in the stack ... */ }; @@ -108,7 +105,6 @@ extern bool lowercase; extern uint16 cnum; extern bool readbraw_supported; extern int max_xmit; -extern pstring cur_dir; extern int get_total_time_ms; extern int get_total_size; @@ -117,7 +113,7 @@ static int tarhandle; static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t mtime, const char *amode, unsigned char ftype); -static void do_atar(char *rname,char *lname,file_info *finfo1); +static void do_atar(const char *rname_in,char *lname,file_info *finfo1); static void do_tar(file_info *finfo, const char *dir); static void oct_it(SMB_BIG_UINT value, int ndgs, char *p); static void fixtarname(char *tptr, const char *fp, size_t l); @@ -127,7 +123,7 @@ static void dotareof(int f); static void initarbuf(void); /* restore functions */ -static long readtarheader(union hblock *hb, file_info2 *finfo, char *prefix); +static long readtarheader(union hblock *hb, file_info2 *finfo, const char *prefix); static long unoct(char *p, int ndgs); static void do_tarput(void); static void unfixtarname(char *tptr, char *fp, int l, bool first); @@ -167,7 +163,7 @@ static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t m DEBUG(5, ("WriteTarHdr, Type = %c, Size= %.0f, Name = %s\n", ftype, (double)size, aname)); memset(hb.dummy, 0, sizeof(hb.dummy)); - + l=strlen(aname); /* We will be prepending a '.' in fixtarheader so use +2 to * take care of the . and terminating zero. JRA. @@ -201,12 +197,7 @@ static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t m oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.uid); oct_it((SMB_BIG_UINT)0, 8, hb.dbuf.gid); oct_it((SMB_BIG_UINT) size, 13, hb.dbuf.size); -#ifdef HAVE_LONGLONG - if (size > (SMB_BIG_UINT)077777777777LL) { -#else - if (size > (SMB_BIG_UINT)077777777777) { -#endif - + if (size > (SMB_BIG_UINT)077777777777LL) { /* This is a non-POSIX compatible extention to store files greater than 8GB. */ @@ -219,7 +210,7 @@ static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t m memcpy(hb.dbuf.chksum, " ", sizeof(hb.dbuf.chksum)); memset(hb.dbuf.linkname, 0, NAMSIZ); hb.dbuf.linkflag=ftype; - + for (chk=0, i=sizeof(hb.dummy), jp=hb.dummy; --i>=0;) chk+=(0xFF & *jp++); @@ -233,7 +224,7 @@ static void writetarheader(int f, const char *aname, SMB_BIG_UINT size, time_t m Read a tar header into a hblock structure, and validate ***************************************************************************/ -static long readtarheader(union hblock *hb, file_info2 *finfo, char *prefix) +static long readtarheader(union hblock *hb, file_info2 *finfo, const char *prefix) { long chk, fchk; int i; @@ -284,7 +275,7 @@ static long readtarheader(union hblock *hb, file_info2 *finfo, char *prefix) if (hb->dbuf.linkflag == 0) { DEBUG(6, ("Warning: NULL link flag (gnu tar archive ?) %s\n", finfo->name)); - } else { + } else { if (hb -> dbuf.linkflag == 'L') { /* We have a longlink */ /* Do nothing here at the moment. do_tarput will handle this as long as the longlink gets back to it, as it has to advance @@ -296,7 +287,7 @@ of link other than a GNUtar Longlink - ignoring\n")); } } } - + if ((unoct(hb->dbuf.mode, sizeof(hb->dbuf.mode)) & S_IFDIR) || (*(finfo->name+strlen(finfo->name)-1) == '\\')) { finfo->mode=aDIR; @@ -369,7 +360,7 @@ static void dozerobuf(int f, int n) if (dry_run) return; - + if (n+tp >= tbufsiz) { memset(tarbuf+tp, 0, tbufsiz-tp); write(f, tarbuf, tbufsiz); @@ -446,13 +437,13 @@ static void oct_it (SMB_BIG_UINT value, int ndgs, char *p) /* skip final null, but do final space */ --ndgs; p[--ndgs] = ' '; - + /* Loop does at least one digit */ do { p[--ndgs] = '0' + (char) (value & 7); value >>= 3; } while (ndgs > 0 && value != 0); - + /* Do leading zeros */ while (ndgs > 0) p[--ndgs] = '0'; @@ -478,8 +469,8 @@ static long unoct(char *p, int ndgs) } /**************************************************************************** -Compare two strings in a slash insensitive way, allowing s1 to match s2 -if s1 is an "initial" string (up to directory marker). Thus, if s2 is +Compare two strings in a slash insensitive way, allowing s1 to match s2 +if s1 is an "initial" string (up to directory marker). Thus, if s2 is a file in any subdirectory of s1, declare a match. ***************************************************************************/ @@ -513,13 +504,14 @@ static int strslashcmp(char *s1, char *s2) Ensure a remote path exists (make if necessary) ***************************************************************************/ -static bool ensurepath(char *fname) +static bool ensurepath(const char *fname) { /* *must* be called with buffer ready malloc'ed */ /* ensures path exists */ char *partpath, *ffname; - char *p=fname, *basehack; + const char *p=fname; + char *basehack; DEBUG(5, ( "Ensurepath called with: %s\n", fname)); @@ -540,10 +532,13 @@ static bool ensurepath(char *fname) safe_strcpy(ffname, fname, strlen(fname)); /* do a `basename' on ffname, so don't try and make file name directory */ - if ((basehack=strrchr_m(ffname, '\\')) == NULL) + if ((basehack=strrchr_m(ffname, '\\')) == NULL) { + SAFE_FREE(partpath); + SAFE_FREE(ffname); return True; - else + } else { *basehack='\0'; + } p=strtok(ffname, "\\"); @@ -552,7 +547,9 @@ static bool ensurepath(char *fname) if (!cli_chkpath(cli, partpath)) { if (!cli_mkdir(cli, partpath)) { - DEBUG(0, ("Error mkdirhiering\n")); + SAFE_FREE(partpath); + SAFE_FREE(ffname); + DEBUG(0, ("Error mkdir %s\n", cli_errstr(cli))); return False; } else { DEBUG(3, ("mkdirhiering %s\n", partpath)); @@ -563,6 +560,8 @@ static bool ensurepath(char *fname) p = strtok(NULL,"/\\"); } + SAFE_FREE(partpath); + SAFE_FREE(ffname); return True; } @@ -570,7 +569,7 @@ static int padit(char *buf, SMB_BIG_UINT bufsize, SMB_BIG_UINT padsize) { int berr= 0; int bytestowrite; - + DEBUG(5, ("Padding with %0.f zeros\n", (double)padsize)); memset(buf, 0, (size_t)bufsize); while( !berr && padsize > 0 ) { @@ -578,7 +577,7 @@ static int padit(char *buf, SMB_BIG_UINT bufsize, SMB_BIG_UINT padsize) berr = dotarbuf(tarhandle, buf, bytestowrite) != bytestowrite; padsize -= bytestowrite; } - + return berr; } @@ -603,60 +602,67 @@ static void do_setrattr(char *name, uint16 attr, int set) append one remote file to the tar file ***************************************************************************/ -static void do_atar(char *rname,char *lname,file_info *finfo1) +static void do_atar(const char *rname_in,char *lname,file_info *finfo1) { - int fnum; + int fnum = -1; SMB_BIG_UINT nread=0; char ftype; file_info2 finfo; bool shallitime=True; - char data[65520]; + char *data = NULL; int read_size = 65520; int datalen=0; + char *rname = NULL; + TALLOC_CTX *ctx = talloc_stackframe(); struct timeval tp_start; GetTimeOfDay(&tp_start); + data = SMB_MALLOC(read_size); + if (!data) { + DEBUG(0,("do_atar: out of memory.\n")); + goto cleanup; + } + ftype = '0'; /* An ordinary file ... */ - if (finfo1) { - finfo.size = finfo1 -> size; - finfo.mode = finfo1 -> mode; - finfo.uid = finfo1 -> uid; - finfo.gid = finfo1 -> gid; - finfo.mtime_ts = finfo1 -> mtime_ts; - finfo.atime_ts = finfo1 -> atime_ts; - finfo.ctime_ts = finfo1 -> ctime_ts; - finfo.name = finfo1 -> name; - } else { - /* DEAL WITH NULL finfo1. */ - /* FIXME !!! JRA */ - } + ZERO_STRUCT(finfo); + + finfo.size = finfo1 -> size; + finfo.mode = finfo1 -> mode; + finfo.uid = finfo1 -> uid; + finfo.gid = finfo1 -> gid; + finfo.mtime_ts = finfo1 -> mtime_ts; + finfo.atime_ts = finfo1 -> atime_ts; + finfo.ctime_ts = finfo1 -> ctime_ts; if (dry_run) { - DEBUG(3,("skipping file %s of size %12.0f bytes\n", finfo.name, + DEBUG(3,("skipping file %s of size %12.0f bytes\n", finfo1->name, (double)finfo.size)); shallitime=0; ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK); ntarf++; - return; + goto cleanup; } - fnum = cli_open(cli, rname, O_RDONLY, DENY_NONE); + rname = clean_name(ctx, rname_in); + if (!rname) { + goto cleanup; + } -/* pstring_clean_name(rname); FIXME !!! JRA */ + fnum = cli_open(cli, rname, O_RDONLY, DENY_NONE); if (fnum == -1) { DEBUG(0,("%s opening remote file %s (%s)\n", - cli_errstr(cli),rname, cur_dir)); - return; + cli_errstr(cli),rname, client_get_cur_dir())); + goto cleanup; } finfo.name = string_create_s(strlen(rname)); if (finfo.name == NULL) { DEBUG(0, ("Unable to allocate space for finfo.name in do_atar\n")); - return; + goto cleanup; } safe_strcpy(finfo.name,rname, strlen(rname)); @@ -664,7 +670,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) time_t atime, mtime; if (!cli_getattrE(cli, fnum, &finfo.mode, &finfo.size, NULL, &atime, &mtime)) { DEBUG(0, ("getattrE: %s\n", cli_errstr(cli))); - return; + goto cleanup; } finfo.atime_ts = convert_time_t_to_timespec(atime); finfo.mtime_ts = convert_time_t_to_timespec(mtime); @@ -687,18 +693,18 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) DEBUG(3,("getting file %s of size %.0f bytes as a tar file %s", finfo.name, (double)finfo.size, lname)); - + do { - + DEBUG(3,("nread=%.0f\n",(double)nread)); - + datalen = cli_read(cli, fnum, data, nread, read_size); - + if (datalen == -1) { DEBUG(0,("Error reading file %s : %s\n", rname, cli_errstr(cli))); break; } - + nread += datalen; /* Only if the first read succeeds, write out the tar header. */ @@ -726,7 +732,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) DEBUG(0,("Error writing to tar file - %s\n", strerror(errno))); break; } - + if ( (datalen == 0) && (finfo.size != 0) ) { DEBUG(0,("Error reading file %s. Got 0 bytes\n", rname)); break; @@ -747,7 +753,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) /* round tar file to nearest block */ if (finfo.size % TBLOCK) dozerobuf(tarhandle, TBLOCK - (finfo.size % TBLOCK)); - + ttarf+=finfo.size + TBLOCK - (finfo.size % TBLOCK); ntarf++; } else { @@ -755,8 +761,9 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) shallitime=0; } } - + cli_close(cli, fnum); + fnum = -1; if (shallitime) { struct timeval tp_end; @@ -765,7 +772,7 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) /* if shallitime is true then we didn't skip */ if (tar_reset && !dry_run) (void) do_setrattr(finfo.name, aARCH, ATTRRESET); - + GetTimeOfDay(&tp_end); this_time = (tp_end.tv_sec - tp_start.tv_sec)*1000 + (tp_end.tv_usec - tp_start.tv_usec)/1000; get_total_time_ms += this_time; @@ -782,6 +789,15 @@ static void do_atar(char *rname,char *lname,file_info *finfo1) finfo.size / MAX(0.001, (1.024*this_time)), get_total_size / MAX(0.001, (1.024*get_total_time_ms)))); } + + cleanup: + + if (fnum != -1) { + cli_close(cli, fnum); + fnum = -1; + } + TALLOC_FREE(ctx); + SAFE_FREE(data); } /**************************************************************************** @@ -790,64 +806,93 @@ Append single file to tar file (or not) static void do_tar(file_info *finfo, const char *dir) { - pstring rname; + TALLOC_CTX *ctx = talloc_stackframe(); if (strequal(finfo->name,"..") || strequal(finfo->name,".")) return; /* Is it on the exclude list ? */ if (!tar_excl && clipn) { - pstring exclaim; - - DEBUG(5, ("Excl: strlen(cur_dir) = %d\n", (int)strlen(cur_dir))); + char *exclaim; - pstrcpy(exclaim, cur_dir); - *(exclaim+strlen(exclaim)-1)='\0'; + DEBUG(5, ("Excl: strlen(cur_dir) = %d\n", (int)strlen(client_get_cur_dir()))); - pstrcat(exclaim, "\\"); - pstrcat(exclaim, finfo->name); + exclaim = talloc_asprintf(ctx, + "%s\\%s", + client_get_cur_dir(), + finfo->name); + if (!exclaim) { + return; + } DEBUG(5, ("...tar_re_search: %d\n", tar_re_search)); if ((!tar_re_search && clipfind(cliplist, clipn, exclaim)) || (tar_re_search && mask_match_list(exclaim, cliplist, clipn, True))) { DEBUG(3,("Skipping file %s\n", exclaim)); + TALLOC_FREE(exclaim); return; } + TALLOC_FREE(exclaim); } if (finfo->mode & aDIR) { - pstring saved_curdir; - pstring mtar_mask; + char *saved_curdir = NULL; + char *new_cd = NULL; + char *mtar_mask = NULL; - pstrcpy(saved_curdir, cur_dir); + saved_curdir = talloc_strdup(ctx, client_get_cur_dir()); + if (!saved_curdir) { + return; + } - DEBUG(5, ("Sizeof(cur_dir)=%d, strlen(cur_dir)=%d, \ + DEBUG(5, ("strlen(cur_dir)=%d, \ strlen(finfo->name)=%d\nname=%s,cur_dir=%s\n", - (int)sizeof(cur_dir), (int)strlen(cur_dir), - (int)strlen(finfo->name), finfo->name, cur_dir)); - - pstrcat(cur_dir,finfo->name); - pstrcat(cur_dir,"\\"); + (int)strlen(saved_curdir), + (int)strlen(finfo->name), finfo->name, saved_curdir)); + + new_cd = talloc_asprintf(ctx, + "%s%s\\", + client_get_cur_dir(), + finfo->name); + if (!new_cd) { + return; + } + client_set_cur_dir(new_cd); - DEBUG(5, ("Writing a dir, Name = %s\n", cur_dir)); + DEBUG(5, ("Writing a dir, Name = %s\n", client_get_cur_dir())); - /* write a tar directory, don't bother with mode - just set it to - * 40755 */ - writetarheader(tarhandle, cur_dir, 0, finfo->mtime_ts.tv_sec, "040755 \0", '5'); + /* write a tar directory, don't bother with mode - just + * set it to 40755 */ + writetarheader(tarhandle, client_get_cur_dir(), 0, + finfo->mtime_ts.tv_sec, "040755 \0", '5'); if (tar_noisy) { - DEBUG(0,(" directory %s\n", cur_dir)); + DEBUG(0,(" directory %s\n", + client_get_cur_dir())); } ntarf++; /* Make sure we have a file on there */ - pstrcpy(mtar_mask,cur_dir); - pstrcat(mtar_mask,"*"); + mtar_mask = talloc_asprintf(ctx, + "%s*", + client_get_cur_dir()); + if (!mtar_mask) { + return; + } DEBUG(5, ("Doing list with mtar_mask: %s\n", mtar_mask)); do_list(mtar_mask, attribute, do_tar, False, True); - pstrcpy(cur_dir,saved_curdir); + client_set_cur_dir(saved_curdir); + TALLOC_FREE(saved_curdir); + TALLOC_FREE(new_cd); + TALLOC_FREE(mtar_mask); } else { - pstrcpy(rname,cur_dir); - pstrcat(rname,finfo->name); + char *rname = talloc_asprintf(ctx, + "%s%s", + client_get_cur_dir(), + finfo->name); + if (!rname) { + return; + } do_atar(rname,finfo->name,finfo); + TALLOC_FREE(rname); } } @@ -959,7 +1004,7 @@ static int get_file(file_info2 finfo) DEBUG(5, ("get_file: file: %s, size %.0f\n", finfo.name, (double)finfo.size)); - if (ensurepath(finfo.name) && + if (ensurepath(finfo.name) && (fnum=cli_open(cli, finfo.name, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE)) == -1) { DEBUG(0, ("abandoning restore\n")); return(False); @@ -1045,7 +1090,7 @@ static int get_file(file_info2 finfo) } /* Create a directory. We just ensure that the path exists and return as there - is no file associated with a directory + is no file associated with a directory */ static int get_dir(file_info2 finfo) { @@ -1067,7 +1112,7 @@ static char *get_longfilename(file_info2 finfo) { /* finfo.size here is the length of the filename as written by the "/./@LongLink" name * header call. */ - int namesize = finfo.size + strlen(cur_dir) + 2; + int namesize = finfo.size + strlen(client_get_cur_dir()) + 2; char *longname = (char *)SMB_MALLOC(namesize); int offset = 0, left = finfo.size; bool first = True; @@ -1082,9 +1127,9 @@ static char *get_longfilename(file_info2 finfo) /* First, add cur_dir to the long file name */ - if (strlen(cur_dir) > 0) { - strncpy(longname, cur_dir, namesize); - offset = strlen(cur_dir); + if (strlen(client_get_cur_dir()) > 0) { + strncpy(longname, client_get_cur_dir(), namesize); + offset = strlen(client_get_cur_dir()); } /* Loop through the blocks picking up the name */ @@ -1131,7 +1176,8 @@ static void do_tarput(void) DEBUG(5, ("Reading the next header ...\n")); - switch (readtarheader((union hblock *) buffer_p, &finfo, cur_dir)) { + switch (readtarheader((union hblock *) buffer_p, + &finfo, client_get_cur_dir())) { case -2: /* Hmm, not good, but not fatal */ DEBUG(0, ("Skipping %s...\n", finfo.name)); if ((next_block(tarbuf, &buffer_p, tbufsiz) <= 0) && !skip_file(finfo.size)) { @@ -1175,7 +1221,7 @@ static void do_tarput(void) linkflag = ((union hblock *)buffer_p) -> dbuf.linkflag; switch (linkflag) { case '0': /* Should use symbolic names--FIXME */ - /* + /* * Skip to the next block first, so we can get the file, FIXME, should * be in get_file ... * The 'finfo.size != 0' fix is from Bob Boehmer <boehmer@worldnet.att.net> @@ -1223,10 +1269,11 @@ Blocksize command int cmd_block(void) { - fstring buf; + TALLOC_CTX *ctx = talloc_tos(); + char *buf; int block; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (!next_token_nr_talloc(ctx,NULL,&buf,NULL)) { DEBUG(0, ("blocksize <n>\n")); return 1; } @@ -1239,7 +1286,6 @@ int cmd_block(void) blocksize=block; DEBUG(2,("blocksize is now %d\n", blocksize)); - return 0; } @@ -1249,9 +1295,10 @@ command to set incremental / reset mode int cmd_tarmode(void) { - fstring buf; + TALLOC_CTX *ctx = talloc_tos(); + char *buf; - while (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + while (next_token_nr_talloc(ctx,NULL,&buf,NULL)) { if (strequal(buf, "full")) tar_inc=False; else if (strequal(buf, "inc")) @@ -1274,6 +1321,7 @@ int cmd_tarmode(void) tar_noisy=False; else DEBUG(0, ("tarmode: unrecognised option %s\n", buf)); + TALLOC_FREE(buf); } DEBUG(0, ("tarmode is now %s, %s, %s, %s, %s\n", @@ -1291,23 +1339,29 @@ Feeble attrib command int cmd_setmode(void) { + TALLOC_CTX *ctx = talloc_tos(); char *q; - fstring buf; - pstring fname; + char *buf; + char *fname = NULL; uint16 attra[2]; int direct=1; attra[0] = attra[1] = 0; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (!next_token_nr_talloc(ctx,NULL,&buf,NULL)) { DEBUG(0, ("setmode <filename> <[+|-]rsha>\n")); return 1; } - pstrcpy(fname, cur_dir); - pstrcat(fname, buf); + fname = talloc_asprintf(ctx, + "%s%s", + client_get_cur_dir(), + buf); + if (!fname) { + return 1; + } - while (next_token_nr(NULL,buf,NULL,sizeof(buf))) { + while (next_token_nr_talloc(ctx,NULL,&buf,NULL)) { q=buf; while(*q) { @@ -1354,12 +1408,13 @@ Principal command for creating / extracting int cmd_tar(void) { - fstring buf; + TALLOC_CTX *ctx = talloc_tos(); + char *buf; char **argl = NULL; int argcl = 0; int ret; - if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) { + if (!next_token_nr_talloc(ctx,NULL,&buf,NULL)) { DEBUG(0,("tar <c|x>[IXbgan] <filename>\n")); return 1; } @@ -1379,6 +1434,7 @@ Command line (option) version int process_tar(void) { + TALLOC_CTX *ctx = talloc_tos(); int rc = 0; initarbuf(); switch(tar_type) { @@ -1396,7 +1452,7 @@ int process_tar(void) case 'c': if (clipn && tar_excl) { int i; - pstring tarmac; + char *tarmac = NULL; for (i=0; i<clipn; i++) { DEBUG(5,("arg %d = %s\n", i, cliplist[i])); @@ -1404,44 +1460,72 @@ int process_tar(void) if (*(cliplist[i]+strlen(cliplist[i])-1)=='\\') { *(cliplist[i]+strlen(cliplist[i])-1)='\0'; } - + if (strrchr_m(cliplist[i], '\\')) { - pstring saved_dir; - - pstrcpy(saved_dir, cur_dir); - + char *p; + char *saved_dir = talloc_strdup(ctx, + client_get_cur_dir()); + if (!saved_dir) { + return 1; + } + if (*cliplist[i]=='\\') { - pstrcpy(tarmac, cliplist[i]); + tarmac = talloc_strdup(ctx, + cliplist[i]); } else { - pstrcpy(tarmac, cur_dir); - pstrcat(tarmac, cliplist[i]); + tarmac = talloc_asprintf(ctx, + "%s%s", + client_get_cur_dir(), + cliplist[i]); } - pstrcpy(cur_dir, tarmac); - *(strrchr_m(cur_dir, '\\')+1)='\0'; + if (!tarmac) { + return 1; + } + p = strrchr_m(tarmac, '\\'); + if (!p) { + return 1; + } + p[1] = '\0'; + client_set_cur_dir(tarmac); DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac)); do_list(tarmac,attribute,do_tar, False, True); - pstrcpy(cur_dir,saved_dir); + + client_set_cur_dir(saved_dir); + + TALLOC_FREE(saved_dir); + TALLOC_FREE(tarmac); } else { - pstrcpy(tarmac, cur_dir); - pstrcat(tarmac, cliplist[i]); + tarmac = talloc_asprintf(ctx, + "%s%s", + client_get_cur_dir(), + cliplist[i]); + if (!tarmac) { + return 1; + } DEBUG(5, ("process_tar, do_list with tarmac: %s\n", tarmac)); do_list(tarmac,attribute,do_tar, False, True); + TALLOC_FREE(tarmac); } } } else { - pstring mask; - pstrcpy(mask,cur_dir); + char *mask = talloc_asprintf(ctx, + "%s\\*", + client_get_cur_dir()); + if (!mask) { + return 1; + } DEBUG(5, ("process_tar, do_list with mask: %s\n", mask)); - pstrcat(mask,"\\*"); do_list(mask,attribute,do_tar,False, True); + TALLOC_FREE(mask); } - - if (ntarf) + + if (ntarf) { dotareof(tarhandle); + } close(tarhandle); SAFE_FREE(tarbuf); - + DEBUG(0, ("tar: dumped %d files and directories\n", ntarf)); DEBUG(0, ("Total bytes written: %.0f\n", (double)ttarf)); break; @@ -1522,11 +1606,11 @@ static int read_inclusion_file(char *filename) break; } } - + if (buf[strlen(buf)-1] == '\n') { buf[strlen(buf)-1] = '\0'; } - + if ((strlen(buf) + 1 + inclusion_buffer_sofar) >= inclusion_buffer_size) { inclusion_buffer_size *= 2; inclusion_buffer = (char *)SMB_REALLOC(inclusion_buffer,inclusion_buffer_size); @@ -1537,7 +1621,7 @@ static int read_inclusion_file(char *filename) break; } } - + safe_strcpy(inclusion_buffer + inclusion_buffer_sofar, buf, inclusion_buffer_size - inclusion_buffer_sofar); inclusion_buffer_sofar += strlen(buf) + 1; clipn++; @@ -1588,7 +1672,7 @@ static int read_inclusion_file(char *filename) } return 0; } - + /* cliplist and its elements are freed at the end of process_tar. */ return 1; } @@ -1639,7 +1723,7 @@ int tar_parseargs(int argc, char *argv[], const char *Optarg, int Optind) return 0; } else { SMB_STRUCT_STAT stbuf; - + if (sys_stat(argv[Optind], &stbuf) == 0) { newer_than = stbuf.st_mtime; DEBUG(1,("Getting files newer than %s", |