From 08c09394cef979627890ad9278d62ee69b0a2951 Mon Sep 17 00:00:00 2001 From: rounak bhatia Date: Fri, 22 May 2026 15:58:59 +0530 Subject: [PATCH 1/3] fixed logfile clear logic --- browserstack/local.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/browserstack/local.py b/browserstack/local.py index 544c791..87ab146 100644 --- a/browserstack/local.py +++ b/browserstack/local.py @@ -93,7 +93,14 @@ def start(self, **kwargs): self.proc = subprocess.Popen(self._generate_cmd(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = self.proc.communicate() - os.system('echo "" > "'+ self.local_logfile_path +'"') + logfile_dir = os.path.dirname(self.local_logfile_path) + if logfile_dir: + os.makedirs(logfile_dir, exist_ok=True) + try: + with open(self.local_logfile_path, 'w') as f: + f.write('') + except OSError as e: + raise BrowserStackLocalError('Unable to open logfile: {}'.format(e)) try: if out: output_string = out.decode() From e89bb01ea27fee7d599c73a3cdf01408dbfa7b72 Mon Sep 17 00:00:00 2001 From: rounak bhatia Date: Fri, 22 May 2026 16:41:26 +0530 Subject: [PATCH 2/3] fixes for binarypath arg --- browserstack/local.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/browserstack/local.py b/browserstack/local.py index 87ab146..d4da3b9 100644 --- a/browserstack/local.py +++ b/browserstack/local.py @@ -1,4 +1,4 @@ -import subprocess, os, time, json,logging +import subprocess, os, time, json, logging, re import psutil from browserstack.local_binary import LocalBinary @@ -70,7 +70,16 @@ def start(self, **kwargs): del self.options['key'] if 'binarypath' in self.options: - self.binary_path = self.options['binarypath'] + candidate = os.path.realpath(self.options['binarypath']) + if not os.path.isfile(candidate): + raise BrowserStackLocalError('binarypath does not point to a file') + try: + version_output = subprocess.check_output([candidate, '--version']).decode('utf-8') + except (subprocess.SubprocessError, OSError) as e: + raise BrowserStackLocalError('binarypath failed verification: {}'.format(e)) + if not re.match(r'BrowserStack Local version \d+\.\d+', version_output): + raise BrowserStackLocalError('binarypath failed verification') + self.binary_path = candidate del self.options['binarypath'] else: l = LocalBinary(self.key) From b5bb4f777b0c4b9044b4dd9dcb951f5f78e3617e Mon Sep 17 00:00:00 2001 From: rounak bhatia Date: Fri, 22 May 2026 18:27:06 +0530 Subject: [PATCH 3/3] fixes for LOC-6720 --- .github/workflows/Semgrep.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Semgrep.yml b/.github/workflows/Semgrep.yml index 0347afd..80b376b 100644 --- a/.github/workflows/Semgrep.yml +++ b/.github/workflows/Semgrep.yml @@ -27,7 +27,7 @@ jobs: container: # A Docker image with Semgrep installed. Do not change this. - image: returntocorp/semgrep + image: returntocorp/semgrep@sha256:9349edbadf90c3f3c0c3f55867625354e89680e6fa10d9034042af52fdb0e0d0 # Skip any PR created by dependabot to avoid permission issues: if: (github.actor != 'dependabot[bot]') diff --git a/setup.py b/setup.py index 7cf8cc6..6af15db 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ keywords = ['BrowserStack', 'Local', 'selenium', 'testing'], classifiers = [], install_requires=[ - 'psutil', + 'psutil>=5.6.6,<7', ], )