summaryrefslogtreecommitdiff
path: root/archivers/lha/files/patch-util.c
blob: 9d7fbe21808a70dfe8c664be215a36e25162cbb7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
--- src/util.c.orig	2000-10-04 14:57:38 UTC
+++ src/util.c
@@ -28,10 +28,10 @@ copyfile(f1, f2, size, crc_flg)	/* retur
 				 * append */
 {
 	unsigned short  xsize;
-	char           *buf;
+	unsigned char   *buf;
 	long            rsize = 0;
 
-	if ((buf = (char *) malloc(BUFFERSIZE)) == NULL)
+	if ((buf = (unsigned char *) malloc(BUFFERSIZE)) == NULL)
 		fatal_error("virtual memory exhausted.\n");
 	crc = 0;
 	if ((crc_flg == 2 || crc_flg) && text_mode)
@@ -100,9 +100,7 @@ encode_stored_crc(ifp, ofp, size, origin
 	erreturns *filename														*/
 /* ------------------------------------------------------------------------ */
 unsigned char  *
-convdelim(path, delim)
-	unsigned char  *path;
-	unsigned char   delim;
+convdelim(unsigned char *path, unsigned char delim)
 {
 	unsigned char   c;
 	unsigned char  *p;
@@ -276,21 +274,27 @@ rmdir(path)
 	char           *path;
 {
 	int             stat, rtn = 0;
-	char           *cmdname;
-	if ((cmdname = (char *) malloc(strlen(RMDIRPATH) + 1 + strlen(path) + 1))
-	    == 0)
+	pid_t           child;
+
+
+	/* XXX thomas: shell meta chars in path could exec commands */
+	/* therefore we should avoid using system() */
+	if ((child = fork()) < 0)
+		return (-1);    /* fork error */
+	else if (child) {       /* parent process */
+		while (child != wait(&stat))    /* ignore signals */
+			continue;
+	}
+	else {                  /* child process */
+		execl(RMDIRPATH, "rmdir", path, (char *) 0);
+		/* never come here except execl is error */
 		return (-1);
-	strcpy(cmdname, RMDIRPATH);
-	*(cmdname + strlen(RMDIRPATH)) = ' ';
-	strcpy(cmdname + strlen(RMDIRPATH) + 1, path);
-	if ((stat = system(cmdname)) < 0)
-		rtn = -1;	/* fork or exec error */
-	else if (stat) {	/* RMDIR command error */
-		errno = EIO;
-		rtn = -1;
 	}
-	free(cmdname);
-	return (rtn);
+	if (stat != 0) {
+		errno = EIO;    /* cannot get error num. */
+		return (-1);
+	}
+	return (0);
 }
 
 /* ------------------------------------------------------------------------ */