]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
coccinelle: avoid matching 'errno' as a file descriptor
authorFrantisek Sumsal <frantisek@sumsal.cz>
Sat, 27 Apr 2019 10:26:22 +0000 (12:26 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Sat, 27 Apr 2019 13:46:48 +0000 (15:46 +0200)
The `coccinelle/take-fd.cocci` transformation file attempts to rewrite

r = fd;
fd = -1;

to

r = TAKE_FD(fd);

Unfortunately, using `identifier` or `idexpression` as a metavariable
type in this case wouldn't match more complex location descriptions,
like:

x->fd = fd
fd = -1;

Using 'expression' metavariable type generates false positives,
as you can't specify scope of such expression. The only real example
from the current codebase is the global 'errno' variable, which results
in following patch generated by `spatch`:

--- src/basic/errno-util.h
+++ /tmp/cocci-output-28263-971baa-errno-util.h
@@ -15,8 +15,7 @@ static inline void _reset_errno_(int *sa

 #define UNPROTECT_ERRNO                         \
         do {                                    \
-                errno = _saved_errno_;          \
-                _saved_errno_ = -1;             \
+                errno = TAKE_FD(_saved_errno_);             \
         } while (false)

 static inline int negative_errno(void) {

Let's explicitly state that the matched expression should not equal
'errno' to avoid this. It's not particularly nice, but it should be
enough, at least for now.

coccinelle/take-fd.cocci

index ba242483cd50c7d9f30081fb46fb85af02187303..f7124e789651cfe6db9571c63527cf11839bb8d7 100644 (file)
@@ -6,8 +6,15 @@ expression q;
 - q = -1;
 - return p;
 + return TAKE_FD(q);
+
+/* The ideal solution would use 'local idexpression' to avoid matching errno,
+ * which is a global variable. However, 'idexpression' nor 'identifier'
+ * would match, for example, "x->fd", which is considered 'expression' in
+ * the SmPL grammar
+ */
 @@
-expression p, q;
+expression p != errno;
+expression q;
 @@
 - p = q;
 - q = -1;