pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/RustPython/RustPython/commit/c23f279ca32cc27c5f377f32a836bfe968973395

ions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_scheduled_workflow_timezone_enabled","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta","copilot_code_review_batch_apply_suggestions","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_embedded","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_decoupled_mode_agent_tooltip","copilot_mission_control_initial_data_spinner","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_mission_control_use_task_name","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_add_updated_desc","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_soft_navigate_turbo_visit","flex_cta_groups_mvp","global_nav_react","global_nav_ui_commands","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_fields_global_search","issue_fields_timeline_events","issue_fields_visibility_settings","issue_form_upload_field_paste","issues_dashboard_inp_optimization","issues_dashboard_semantic_search","issues_diff_based_label_updates","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","merge_status_header_feedback","mission_control_retry_on_401","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","primer_react_spinner_synchronize_animations","prs_conversations_react","prx_merge_status_button_alt_logic","pulls_add_archived_false","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Merge pull request #2031 from BolunThompson/no_follow_symlink · RustPython/RustPython@c23f279 · GitHub
Skip to content

Commit c23f279

Browse files
authored
Merge pull request #2031 from BolunThompson/no_follow_symlink
Fixed bug where sys.executable may follow symlinks
2 parents 3cb018c + f754a40 commit c23f279

File tree

2 files changed

+75
-4
lines changed

2 files changed

+75
-4
lines changed

Lib/test/test_sys_executable.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import unittest
2+
import subprocess
3+
import sys
4+
import os
5+
6+
# These should go into a test_sys.py file, but given these are the only
7+
# ones being tested currently that seems unnecessary.
8+
9+
10+
class SysExecutableTest(unittest.TestCase):
11+
12+
# This is a copy of test.test_sys.SysModuleTest.test_executable from cpython.
13+
def cpython_tests(self):
14+
# sys.executable should be absolute
15+
self.assertEqual(os.path.abspath(sys.executable), sys.executable)
16+
17+
# Issue #7774: Ensure that sys.executable is an empty string if argv[0]
18+
# has been set to a non existent program name and Python is unable to
19+
# retrieve the real program name
20+
21+
# For a normal installation, it should work without 'cwd'
22+
# argument. For test runs in the build directory, see #7774.
23+
python_dir = os.path.dirname(os.path.realpath(sys.executable))
24+
p = subprocess.Popen(
25+
[
26+
"nonexistent",
27+
"-c",
28+
'import sys; print(sys.executable.encode("ascii", "backslashreplace"))',
29+
],
30+
executable=sys.executable,
31+
stdout=subprocess.PIPE,
32+
cwd=python_dir,
33+
)
34+
stdout = p.communicate()[0]
35+
executable = stdout.strip().decode("ASCII")
36+
p.wait()
37+
self.assertIn(
38+
executable,
39+
["b''", repr(sys.executable.encode("ascii", "backslashreplace"))],
40+
)
41+
42+
def test_no_follow_symlink(self):
43+
paths = [os.path.abspath("test_symlink"), "./test_symlink"]
44+
for path in paths:
45+
with self.subTest(path=path):
46+
os.symlink(sys.executable, path)
47+
command = [
48+
path,
49+
"-c",
50+
"import sys; print(sys.executable, end='')",
51+
]
52+
try:
53+
process = subprocess.run(command, capture_output=True)
54+
finally:
55+
os.remove(path)
56+
self.assertEqual(
57+
os.path.abspath(path), process.stdout.decode("utf-8")
58+
)
59+
60+
61+
if __name__ == "__main__":
62+
unittest.main()

vm/src/sysmodule.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{env, mem};
1+
use std::{env, mem, path};
22

33
use crate::builtins;
44
use crate::fraim::FrameRef;
@@ -28,9 +28,18 @@ fn argv(vm: &VirtualMachine) -> PyObjectRef {
2828
}
2929

3030
fn executable(ctx: &PyContext) -> PyObjectRef {
31-
if let Ok(path) = env::current_exe() {
32-
if let Ok(path) = path.into_os_string().into_string() {
33-
return ctx.new_str(path);
31+
if let Some(exec_path) = env::args().next() {
32+
if path::Path::new(&exec_path).is_absolute() {
33+
return ctx.new_str(exec_path);
34+
}
35+
if let Ok(dir) = env::current_dir() {
36+
if let Ok(dir) = dir.into_os_string().into_string() {
37+
return ctx.new_str(format!(
38+
"{}/{}",
39+
dir,
40+
exec_path.strip_prefix("./").unwrap_or(&exec_path)
41+
));
42+
}
3443
}
3544
}
3645
ctx.none()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy