Keep track of line numbers for each file context in
selabel_handle. If an error occurs in selabel_fini(), the
line number of an invalid file context is echoed to the user.

Signed-off-by: Yuli Khodorkovskiy <[email protected]>
---
 libselinux/src/label.c          | 2 +-
 libselinux/src/label_file.h     | 1 +
 libselinux/src/label_internal.h | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/libselinux/src/label.c b/libselinux/src/label.c
index e642a97b..d9a58ce9 100644
--- a/libselinux/src/label.c
+++ b/libselinux/src/label.c
@@ -143,7 +143,7 @@ static int selabel_fini(struct selabel_handle *rec,
                            struct selabel_lookup_rec *lr,
                            int translating)
 {
-       if (compat_validate(rec, lr, rec->spec_file, 0))
+       if (compat_validate(rec, lr, rec->spec_file, lr->lineno))
                return -1;
 
        if (translating && !lr->ctx_trans &&
diff --git a/libselinux/src/label_file.h b/libselinux/src/label_file.h
index aa576d8e..4780ae48 100644
--- a/libselinux/src/label_file.h
+++ b/libselinux/src/label_file.h
@@ -472,6 +472,7 @@ static inline int process_line(struct selabel_handle *rec,
        spec_arr[nspec].mode = 0;
 
        spec_arr[nspec].lr.ctx_raw = context;
+       spec_arr[nspec].lr.lineno = lineno;
 
        /*
         * bump data->nspecs to cause closef() to cover it in its free
diff --git a/libselinux/src/label_internal.h b/libselinux/src/label_internal.h
index c55efb75..0e020557 100644
--- a/libselinux/src/label_internal.h
+++ b/libselinux/src/label_internal.h
@@ -73,6 +73,7 @@ struct selabel_lookup_rec {
        char * ctx_raw;
        char * ctx_trans;
        int validated;
+       unsigned lineno;
 };
 
 struct selabel_handle {
-- 
2.14.3


Reply via email to