Thread (13 messages) flat view 13 messages, 4 authors, 2016-06-15

Re: [PATCH] Do _not_ call unlink on a directory

From: Scott Lamb <hidden>
Date: 2016-06-15 22:43:21

Matthieu Moy wrote:
Thomas Glanzmann [off-list ref] writes:

I believe you still have a race condition if ...
quoted
-				if (len > state->base_dir_len && state->force && !unlink(buf) && !mkdir(buf, 0777))
-					continue;
... buf exists here as a file ...
quoted
 				if (!stat(buf, &st) && S_ISDIR(st.st_mode))
 					continue; /* ok */
... and became a directory here.
quoted
+				if (len > state->base_dir_len && state->force && !unlink(buf) && !mkdir(buf, 0777))
+					continue;
But that's quite unlikely to happen. And I have no fix to propose.
If arbitrary other tasks are running, the only way to be absolutely
certain you're not calling unlink() in a directory is to never call
unlink().

SUS describes a safe remove(), but Solaris's implementation contains the
same race:

http://src.opensolaris.org/source/xref/pef/phase_I/usr/src/lib/libc/port/gen/rename.c

so I think this patch is the best that can be done.

Best regards,
Scott

-- 
Scott Lamb <http://www.slamb.org/>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help