From cf4bcc3f1435eafa3ed8b5fadfa9698033d1e2df Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 16 Jan 2022 17:07:41 +0100 Subject: Also add const qualifiers on server side Although in practice the buffers can be modified since they are from the message, it leads to missing const where it would otherwise make sense. --- server.c | 5 +++-- utils.c | 33 +++++++++++++++++++++++++++++++-- utils.h | 2 ++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/server.c b/server.c index 6d089c1..1dd10c8 100644 --- a/server.c +++ b/server.c @@ -268,8 +268,9 @@ WriteLocalPtrDecl(FILE *file, const argument_t *arg) static void WriteServerArgDecl(FILE *file, const argument_t *arg) { - fprintf(file, "%s %s%s", - arg->argType->itTransType, + const char *qualif = ServerVarQualifier(arg); + fprintf(file, "%s%s %s%s", + qualif, arg->argType->itTransType, arg->argByReferenceServer ? "*" : "", arg->argVarName); } diff --git a/utils.c b/utils.c index 5111e73..48c4420 100644 --- a/utils.c +++ b/utils.c @@ -182,13 +182,42 @@ WriteUserVarDecl(FILE *file, const argument_t *arg) fprintf(file, "\t%s%s %s%s", qualif, arg->argType->itUserType, ref, arg->argVarName); } +/* Returns whether parameter should be qualified with const because we will only + receive the pointed data, not modify it. */ +static boolean_t +ServerVarConst(const argument_t *arg) +{ + return (arg->argKind & (akbSend|akbReturn)) == akbSend + && !arg->argType->itStruct; +} + +const char * +ServerVarQualifier(const argument_t *arg) +{ + if (!ServerVarConst(arg)) + return ""; + + if (arg->argType->itIndefinite || + arg->argType->itInName == MACH_MSG_TYPE_STRING_C || + !strcmp(arg->argType->itTransType, "string_t")) + /* This is a pointer, so we have to use the const_foo type to + make const qualify the data, not the pointer. + + Or this is a string_t, which should use const_string_t to avoid + forcing the caller to respect the definite string size */ + return "const_"; + else + return "const "; +} + void WriteServerVarDecl(FILE *file, const argument_t *arg) { + const char *qualif = ServerVarQualifier(arg); const char *ref = arg->argByReferenceServer ? "*" : ""; - fprintf(file, "\t%s %s%s", - arg->argType->itTransType, ref, arg->argVarName); + fprintf(file, "\t%s%s %s%s", + qualif, arg->argType->itTransType, ref, arg->argVarName); } void diff --git a/utils.h b/utils.h index 3a4c832..0524f0c 100644 --- a/utils.h +++ b/utils.h @@ -54,6 +54,8 @@ extern const char *ReturnTypeStr(const routine_t *rt); extern const char *FetchUserType(const ipc_type_t *it); extern const char *FetchServerType(const ipc_type_t *it); +extern const char *ServerVarQualifier(const argument_t *arg); + extern void WriteFieldDeclPrim(FILE *file, const argument_t *arg, const char *(*tfunc)(const ipc_type_t *it)); -- cgit v1.2.3