@@ -284,7 +284,7 @@ char** save_ps_args(int argc, char** argv)
284284 * and the init function was called.
285285 * Otherwise returns NOT_AVAILABLE or NOT_INITIALIZED
286286 */
287- int is_ps_title_available (void )
287+ ps_title_status is_ps_title_available (void )
288288{
289289#ifdef PS_USE_NONE
290290 return PS_TITLE_NOT_AVAILABLE ; /* disabled functionality */
@@ -304,7 +304,7 @@ int is_ps_title_available(void)
304304/*
305305 * Convert error codes into error strings
306306 */
307- const char * ps_title_errno (int rc )
307+ const char * ps_title_errno (ps_title_status rc )
308308{
309309 switch (rc )
310310 {
@@ -320,11 +320,16 @@ const char* ps_title_errno(int rc)
320320 case PS_TITLE_BUFFER_NOT_AVAILABLE :
321321 return "Buffer not contiguous" ;
322322
323- #ifdef PS_USE_WIN32
323+ case PS_TITLE_TOO_LONG :
324+ // TODO Indicate max length?
325+ return "Too long" ;
326+
324327 case PS_TITLE_WINDOWS_ERROR :
328+ #ifdef PS_USE_WIN32
325329 snprintf (windows_error_details , sizeof (windows_error_details ), "Windows error code: %lu" , GetLastError ());
326330 return windows_error_details ;
327331#endif
332+ return "Windows error" ;
328333 }
329334
330335 return "Unknown error code" ;
@@ -337,14 +342,19 @@ const char* ps_title_errno(int rc)
337342 * save_ps_args() was not called.
338343 * Else returns 0 on success.
339344 */
340- int set_ps_title (const char * title )
345+ ps_title_status set_ps_title (const char * title , size_t title_len )
341346{
342- int rc = is_ps_title_available ();
347+ if (title_len >= ps_buffer_size ) {
348+ return PS_TITLE_TOO_LONG ;
349+ }
350+
351+ ps_title_status rc = is_ps_title_available ();
343352 if (rc != PS_TITLE_SUCCESS )
344353 return rc ;
345354
346- size_t title_len = strlcpy (ps_buffer , title , ps_buffer_size );
347- ps_buffer_cur_len = (title_len >= ps_buffer_size ) ? ps_buffer_size - 1 : title_len ;
355+ /* Include final null byte */
356+ memcpy (ps_buffer , title , title_len + 1 );
357+ ps_buffer_cur_len = title_len ;
348358
349359#ifdef PS_USE_SETPROCTITLE
350360 setproctitle ("%s" , ps_buffer );
@@ -394,9 +404,9 @@ int set_ps_title(const char* title)
394404 * length into *displen.
395405 * The return code indicates the error.
396406 */
397- int get_ps_title (size_t * displen , const char * * string )
407+ ps_title_status get_ps_title (size_t * displen , const char * * string )
398408{
399- int rc = is_ps_title_available ();
409+ ps_title_status rc = is_ps_title_available ();
400410 if (rc != PS_TITLE_SUCCESS )
401411 return rc ;
402412
0 commit comments