Skip to content

Commit

Permalink
backend/ipp.c: Fix printing jobs with long names on older IPP printers
Browse files Browse the repository at this point in the history
On older printers (ones which don't support IPP operation Create-Job)
we concatenate job number and title into one string, which we use as
IPP attribute job-name. If the original title was almost 255 chars,
the joining the strings will overflow maximal required length
for this attribute, and Validate-Job fails.

We could check whether the string is longer than 255 and cut it,
but I chose to shrink the buffer to 256, since we already use snprintf()
which will cut the string and put null terminator for us.

Fixes #644
  • Loading branch information
zdohnal committed Jan 16, 2024
1 parent 9ef75d2 commit dc6d173
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ CHANGES - OpenPrinting CUPS 2.4.8 - TBA
Changes in CUPS v2.4.8 (TBA)
----------------------------

- Fixed printing of jobs with job name longer than 255 chars on older printers (Issue #644)
- Really backport fix for Issue #742
- Raised `cups_enum_dests()` timeout for listing available IPP printers (Issue #751)
- Fixed memory leak when unloading a job (Issue #813)
Expand Down
6 changes: 5 additions & 1 deletion backend/ipp.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ main(int argc, /* I - Number of command-line args */
off_t compatsize = 0; /* Size of compatibility file */
int port; /* Port number (not used) */
char uri[HTTP_MAX_URI]; /* Updated URI without user/pass */
char print_job_name[1024]; /* Update job-name for Print-Job */
char print_job_name[256]; /* Update job-name for Print-Job */
http_status_t http_status; /* Status of HTTP request */
ipp_status_t ipp_status; /* Status of IPP request */
http_t *http; /* HTTP connection */
Expand Down Expand Up @@ -1484,6 +1484,10 @@ main(int argc, /* I - Number of command-line args */
}
else
{
/*
* TODO: make this compatible with UTF-8 - possible UTF-8 truncation here..
*/

snprintf(print_job_name, sizeof(print_job_name), "%s - %s", argv[1],
argv[3]);
monitor.job_name = print_job_name;
Expand Down

0 comments on commit dc6d173

Please sign in to comment.