From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-f177.google.com (mail-yw1-f177.google.com [209.85.128.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C8AF30C63B for ; Sun, 5 Jul 2026 04:39:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783226396; cv=none; b=o4NUjnzFa5RJZwhyaJO53Xt49fba2gz4ugNxcmURFKg6emVgZYjdrNCuStBkxPi9BQQPok/1gm6AP7z/qPG93xikA8IoOIP5QNTtmIEelBZ+2RHDXUIa9al6mRzWt5NCI216i8DB9x1QX0IJwvOK9+sX5Li6IRY6TYLHdboJqb4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783226396; c=relaxed/simple; bh=q90RW5tH6qtrTmmd6q8COrQ5Zm3MxujrL6aUddy+6Jw=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=bfdgDDvWJ5fA+m2O0GdAHqGfwj6OZFR6pddzOKOU5Mn0dVLGY1dbu5qfwudoq/KXCTAEBcxNVRLy/07JUUKiFcv1w2hAgpQ6fxuez9fjCow2DZm4P9+G9Fj7CJ4NqmraozNXeNwTm4RyNPoq6XZemyD044Bp65nVT3znpEmHqwU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HYD6/9Ol; arc=none smtp.client-ip=209.85.128.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HYD6/9Ol" Received: by mail-yw1-f177.google.com with SMTP id 00721157ae682-80cfc2c5f67so158857b3.1 for ; Sat, 04 Jul 2026 21:39:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783226394; x=1783831194; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=sbdlEf2xTWXJzXgVbM2XWeDt8l4xTUKqs5M3XQtEYUY=; b=HYD6/9OlsJjPaXuQfVoiRgJysJYVcL5qZKNBrpHMAsC6kFeR+WhAaV0bx42NkZPNGo fKHIUbqExqqnJNITlx1huCyyaLPFCaYfog1jif1kFatO+odRJgEHid5CxiFxJuCgSkxo E+uZon8ugEd0Dq598eVhORRyGWlD62+eYuN1QvJa3Nvdifq8FsvCzXy7mufdBgObv7n1 8NozdtyD42l1Q0j3s2/EyY/aKOiEjEHhPzWXLaQknQFHE/a66Qc1+7pxlzolcW9mlw2K /nntecURUaEGt1OwSRhMqNgtxGKc9GsxEpkpT16F9N5shXha26t4Iml9YI6u+hSaOHuH Dk4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783226394; x=1783831194; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=sbdlEf2xTWXJzXgVbM2XWeDt8l4xTUKqs5M3XQtEYUY=; b=Wv6nOUg8mUQoNQbnvCqJ1mu4dQj0ctdcZg6UFwJ0Ez1/P0URh8RFvScCeWZ+TtY8mQ k2+pm+l7GMJ4FIqY42bWSXRh/qsCGZHzxuQhc5FzbbRDE+Mf1+Bx8vY+8VmNBYB0ss3P kj9u4stEnV22bQfIFMRKjH7obDkFURcrgvfElRz7XZ3JCeCHi6KDMQqcFDN/uDAIKfRa B5pVZpv/rHlW+2d8f5FgC0g06bhshnIdgvZ9G4mzY0XAuhX/s5GF2DGhJIDf3rSXBDiP I4JzSrb6x7JeEpBg+waR9U28h7mvtGSQOdB2dVwJMGlNvnUIQKpLoFiwaslzuucRa3QR b33Q== X-Forwarded-Encrypted: i=1; AHgh+RohrhVNVLEgcB5HH0UcnPjmTPjt52XKLY0yzO8VtMVpdzBqf03FrBQjEzqhp0DLxfMbAVKXEAXC6etZxt4=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8WwoOy0oN7TwTYf71thjkX9j8vUi2qpGE1/RzOyz8NzQPF199 oDXSxjqthl+nrq1q1uKC8k7lFpdBqeBqFhTTPBSUlvNYeUBBKT2Eh8bx X-Gm-Gg: AfdE7cmOOfy3XgH1tT7bDIr0+EXjSxSUlprbg3TTG/UTStfGfiQexBylC0hpQX0zhVO epM3h/jookzO2Eq1qQ+mwpNKJHqwW/1i9yUIJaKhA26UQTwpKviI/jBOhG1LuFE7mQCw0dTfNuz wrhlCQR6KmbEQjnQQiRNG4OoX1cm2vBxvpK80Mwgjcxs9dnqSh6TOdeTICRucsyrB5dSwI/rvjq 7FXfov71yH+7nt8vGxvPbdBbf7JlovekLnNEMkJX7EPwTA1fpFz5aw5RFOVhTQf7zkwF3hNNM1E IOtw3UA4V4xmKYhhFlzP6Ii6rJx8EXFn9pea8MNnNKvmdlUzoheBAXRJEkBe+IiHU+/VhgnI1aT Ri/7nReNlQABaUzR1RP/7nsC9cbVd9/6oe+5Nc1E4WEtQMQHh+h9QK9sc2ZUxf/6PUXet X-Received: by 2002:a05:690c:d84:b0:7ba:d784:8b59 with SMTP id 00721157ae682-817218a3116mr57259757b3.7.1783226394279; Sat, 04 Jul 2026 21:39:54 -0700 (PDT) Received: from desktop ([2600:1700:78e0:fd0::27]) by smtp.gmail.com with ESMTPSA id 00721157ae682-8144bd2b44fsm42051997b3.47.2026.07.04.21.39.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Jul 2026 21:39:53 -0700 (PDT) From: Neal Patalay To: andy@kernel.org, hansg@kernel.org, mchehab@kernel.org, gregkh@linuxfoundation.org Cc: sakari.ailus@linux.intel.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev, mugrinphoto@gmail.com, matt@mattwardle.net, nealpatalay0@gmail.com Subject: [PATCH v2] staging: media: atomisp: refactor pipe graph dump stage formatting Date: Sat, 4 Jul 2026 21:39:20 -0700 Message-ID: <20260705043920.105252-1-nealpatalay0@gmail.com> X-Mailer: git-send-email 2.55.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The original implementation of ia_css_debug_pipe_graph_dump_stage() includes an off-by-one error where the original strscpy() size dropped characters immediately before newlines. It also allocates over 600 bytes across multiple buffers on the stack. Address these shortcomings and reduce stack usage with a single 256 byte buffer via a new helper function, ia_css_debug_build_info(). Fixes: 662fb4fceb1a ("media: atomisp: get rid of a string_support.h abstraction layer") Signed-off-by: Neal Patalay --- v2: - Fixed strscpy typo in commit message - Changed Fixes tag to point to the actual buggy commit - Dropped "flag" parameter from helper function and moved check to the macro - Split long lines to conform with subsystem character limit --- .../pci/runtime/debug/src/ia_css_debug.c | 186 +++++++----------- 1 file changed, 71 insertions(+), 115 deletions(-) diff --git a/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c b/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c index 5113aa5973f3..53d47144d8c9 100644 --- a/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c +++ b/drivers/staging/media/atomisp/pci/runtime/debug/src/ia_css_debug.c @@ -1162,6 +1162,29 @@ void ia_css_debug_pipe_graph_dump_epilogue(void) pg_inst.stream_format = N_ATOMISP_INPUT_FORMAT; } +static void ia_css_debug_build_info(char *info, size_t info_size, + int *offset, + const char *flag_str, size_t flag_str_size, + int *line_len) +{ + /* + * If new line length exceeds max line length, + * replace the last ',' with a "\\n" + */ + if (*line_len > 0 && info_size - *offset >= 2 && + *line_len + flag_str_size > ENABLE_LINE_MAX_LENGTH) { + info[*offset - 1] = '\\'; + info[*offset] = 'n'; + *offset += 1; + *line_len = 0; + } + + int len_written = scnprintf(info + *offset, info_size - *offset, + "%s,", flag_str); + *offset += len_written; + *line_len += len_written; +} + void ia_css_debug_pipe_graph_dump_stage( struct ia_css_pipeline_stage *stage, @@ -1194,123 +1217,56 @@ ia_css_debug_pipe_graph_dump_stage( /* Guard in case of binaries that don't have any binary_info */ if (stage->binary_info) { - char enable_info1[100]; - char enable_info2[100]; - char enable_info3[100]; - char enable_info[302]; + char enable_info[256]; + int offset = 0; + int line_len = 0; struct ia_css_binary_info *bi = stage->binary_info; - /* Split it in 2 function-calls to keep the amount of - * parameters per call "reasonable" - */ - snprintf(enable_info1, sizeof(enable_info1), - "%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - bi->enable.reduced_pipe ? "rp," : "", - bi->enable.vf_veceven ? "vfve," : "", - bi->enable.dis ? "dis," : "", - bi->enable.dvs_envelope ? "dvse," : "", - bi->enable.uds ? "uds," : "", - bi->enable.dvs_6axis ? "dvs6," : "", - bi->enable.block_output ? "bo," : "", - bi->enable.ds ? "ds," : "", - bi->enable.bayer_fir_6db ? "bf6," : "", - bi->enable.raw_binning ? "rawb," : "", - bi->enable.continuous ? "cont," : "", - bi->enable.s3a ? "s3a," : "", - bi->enable.fpnr ? "fpnr," : "", - bi->enable.sc ? "sc," : "" - ); - - snprintf(enable_info2, sizeof(enable_info2), - "%s%s%s%s%s%s%s%s%s%s%s", - bi->enable.macc ? "macc," : "", - bi->enable.output ? "outp," : "", - bi->enable.ref_frame ? "reff," : "", - bi->enable.tnr ? "tnr," : "", - bi->enable.xnr ? "xnr," : "", - bi->enable.params ? "par," : "", - bi->enable.ca_gdc ? "cagdc," : "", - bi->enable.isp_addresses ? "ispa," : "", - bi->enable.in_frame ? "inf," : "", - bi->enable.out_frame ? "outf," : "", - bi->enable.high_speed ? "hs," : "" - ); - - /* And merge them into one string */ - snprintf(enable_info, sizeof(enable_info), "%s%s", - enable_info1, enable_info2); - { - int l, p; - char *ei = enable_info; - - l = strlen(ei); - - /* Replace last ',' with \0 if present */ - if (l && enable_info[l - 1] == ',') - enable_info[--l] = '\0'; - - if (l > ENABLE_LINE_MAX_LENGTH) { - /* Too big for one line, find last comma */ - p = ENABLE_LINE_MAX_LENGTH; - while (ei[p] != ',') - p--; - /* Last comma found, copy till that comma */ - strscpy(enable_info1, ei, umin(p, sizeof(enable_info1))); - - ei += p + 1; - l = strlen(ei); - - if (l <= ENABLE_LINE_MAX_LENGTH) { - /* The 2nd line fits */ - /* we cannot use ei as argument because - * it is not guaranteed dword aligned - */ - - strscpy(enable_info2, ei, umin(l, sizeof(enable_info2))); - - snprintf(enable_info, sizeof(enable_info), "%s\\n%s", - enable_info1, enable_info2); - - } else { - /* 2nd line is still too long */ - p = ENABLE_LINE_MAX_LENGTH; - while (ei[p] != ',') - p--; - - strscpy(enable_info2, ei, umin(p, sizeof(enable_info2))); - - ei += p + 1; - l = strlen(ei); - - if (l <= ENABLE_LINE_MAX_LENGTH) { - /* The 3rd line fits */ - /* we cannot use ei as argument because - * it is not guaranteed dword aligned - */ - strscpy(enable_info3, ei, - sizeof(enable_info3)); - snprintf(enable_info, sizeof(enable_info), - "%s\\n%s\\n%s", - enable_info1, enable_info2, - enable_info3); - } else { - /* 3rd line is still too long */ - p = ENABLE_LINE_MAX_LENGTH; - while (ei[p] != ',') - p--; - strscpy(enable_info3, ei, - umin(p, sizeof(enable_info3))); - ei += p + 1; - strscpy(enable_info3, ei, - sizeof(enable_info3)); - snprintf(enable_info, sizeof(enable_info), - "%s\\n%s\\n%s", - enable_info1, enable_info2, - enable_info3); - } - } - } - } +#define ADD_INFO(flag, flag_str) \ + do { \ + if (bi->enable.flag) \ + ia_css_debug_build_info(enable_info, \ + sizeof(enable_info), \ + &offset, \ + flag_str, \ + sizeof(flag_str), \ + &line_len); \ + } while (0) + + /* Build string in enable_info buffer */ + ADD_INFO(reduced_pipe, "rp"); + ADD_INFO(vf_veceven, "vfve"); + ADD_INFO(dis, "dis"); + ADD_INFO(dvs_envelope, "dvse"); + ADD_INFO(uds, "uds"); + ADD_INFO(dvs_6axis, "dvs6"); + ADD_INFO(block_output, "bo"); + ADD_INFO(ds, "ds"); + ADD_INFO(bayer_fir_6db, "bf6"); + ADD_INFO(raw_binning, "rawb"); + ADD_INFO(continuous, "cont"); + ADD_INFO(s3a, "s3a"); + ADD_INFO(fpnr, "fpnr"); + ADD_INFO(sc, "sc"); + ADD_INFO(macc, "macc"); + ADD_INFO(output, "outp"); + ADD_INFO(ref_frame, "reff"); + ADD_INFO(tnr, "tnr"); + ADD_INFO(xnr, "xnr"); + ADD_INFO(params, "par"); + ADD_INFO(ca_gdc, "cagdc"); + ADD_INFO(isp_addresses, "ispa"); + ADD_INFO(in_frame, "inf"); + ADD_INFO(out_frame, "outf"); + ADD_INFO(high_speed, "hs"); + +#undef ADD_INFO + + /* Replace last ',' with '\0' */ + if (offset > 0) + enable_info[offset - 1] = '\0'; + else + enable_info[0] = '\0'; dtrace_dot("node [shape = circle, fixedsize=true, width=2.5, label=\"%s\\n%s\\n\\n%s\"]; \"%s(pipe%d)\"", bin_type, blob_name, enable_info, blob_name, id); -- 2.55.0