This file is indexed.

/usr/share/arm/util/procName.py is in tor-arm 1.4.5.0-1.1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""
Module to allow for arbitrary renaming of our python process. This is mostly
based on:
http://www.rhinocerus.net/forum/lang-python/569677-setting-program-name-like-0-perl.html#post2272369
and an adaptation by Jake: https://github.com/ioerror/chameleon

A cleaner implementation is available at:
https://github.com/cream/libs/blob/b38970e2a6f6d2620724c828808235be0445b799/cream/util/procname.py
but I'm not quite clear on their implementation, and it only does targeted
argument replacement (ie, replace argv[0], argv[1], etc but with a string
the same size).
"""

import sys
import ctypes
import ctypes.util

# flag for setting the process name, found in '/usr/include/linux/prctl.h'
PR_SET_NAME = 15

argc_t = ctypes.POINTER(ctypes.c_char_p)

Py_GetArgcArgv = ctypes.pythonapi.Py_GetArgcArgv
Py_GetArgcArgv.restype = None
Py_GetArgcArgv.argtypes = [ctypes.POINTER(ctypes.c_int),
                           ctypes.POINTER(argc_t)]

# tracks the last name we've changed the process to
currentProcessName = None
maxNameLength = -1

def renameProcess(processName):
  """
  Renames our current process from "python <args>" to a custom name.
  
  Arguments:
    processName - new name for our process
  """
  
  _setArgv(processName)
  if sys.platform == "linux2":
    _setPrctlName(processName)
  elif sys.platform == "freebsd7":
    _setProcTitle(processName)

def _setArgv(processName):
  """
  Overwrites our argv in a similar fashion to how it's done in C with:
  strcpy(argv[0], "new_name");
  """
  
  global currentProcessName, maxNameLength
  
  argv = ctypes.c_int(0)
  argc = argc_t()
  Py_GetArgcArgv(argv, ctypes.pointer(argc))
  
  # The original author did the memset for 256, while Jake did it for the
  # processName length (capped at 1608). I'm not sure of the reasons for
  # either of these limits, but setting it to anything higher than than the
  # length of the null terminated process name should be pointless, so opting
  # for Jake's implementation on this.
  
  if currentProcessName == None:
    # Getting argv via...
    # currentProcessName = " ".join(["python"] + sys.argv)
    # 
    # doesn't do the trick since this will miss interpretor arguments like...
    # python -W ignore::DeprecationWarning myScript.py
    # 
    # Hence we're fetching this via our ctypes argv. Alternatively we could
    # use ps, though this is less desirable:
    # "ps -p %i -o args" % os.getpid()
    
    args = []
    for i in range(100):
      if argc[i] == None: break
      args.append(str(argc[i]))
    
    currentProcessName = " ".join(args)
    maxNameLength = len(currentProcessName)
  
  if len(processName) > maxNameLength:
    msg = "can't rename process to something longer than our initial name since this would overwrite memory used for the env"
    raise IOError(msg)
  
  # space we need to clear
  zeroSize = max(len(currentProcessName), len(processName))
  
  ctypes.memset(argc.contents, 0, zeroSize + 1) # null terminate the string's end
  ctypes.memmove(argc.contents, processName, len(processName))
  currentProcessName = processName

def _setPrctlName(processName):
  """
  Sets the prctl name, which is used by top and killall. This appears to be
  Linux specific and has the max of 15 characters. Source:
  http://stackoverflow.com/questions/564695/is-there-a-way-to-change-effective-process-name-in-python/923034#923034
  """
  
  libc = ctypes.CDLL(ctypes.util.find_library("c"))
  nameBuffer = ctypes.create_string_buffer(len(processName)+1)
  nameBuffer.value = processName
  libc.prctl(PR_SET_NAME, ctypes.byref(nameBuffer), 0, 0, 0)

def _setProcTitle(processName):
  """
  BSD specific calls (should be compataible with both FreeBSD and OpenBSD:
  http://fxr.watson.org/fxr/source/gen/setproctitle.c?v=FREEBSD-LIBC
  http://www.rootr.net/man/man/setproctitle/3
  """
  
  libc = ctypes.CDLL(ctypes.util.find_library("c"))
  nameBuffer = ctypes.create_string_buffer(len(processName)+1)
  nameBuffer.value = processName
  libc.setproctitle(ctypes.byref(nameBuffer))